home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 551-575 / disk_562 / intuisup / editor / source.lzh / editor.c < prev    next >
C/C++ Source or Header  |  1991-10-25  |  25KB  |  772 lines

  1.         /*************************************
  2.          *                                   *
  3.          *             Editor v1.0           *
  4.          *   by Torsten Jürgeleit in 07/91   *
  5.          *                                   *
  6.          *             Editor part           *
  7.          *                                   *
  8.          *************************************/
  9.  
  10.     /* Includes */
  11.  
  12. #include "includes.h"
  13. #include "defines.h"
  14. #include "imports.h"
  15. #include "protos.h"
  16.  
  17.     /* Defines for editor gadgets */
  18.  
  19. #define FIRST_MODE_GADGET    EDITOR_GADGET_CREATE
  20.  
  21. #define EDITOR_GADGET1_TYPE        GADGET_DATA_TYPE_CYCLE
  22. #define EDITOR_GADGET1_FLAGS        (GADGET_DATA_FLAG_HOT_KEY | GADGET_DATA_FLAG_TEXT_LEFT)
  23. #define EDITOR_GADGET1_TEXT        "_Type"
  24. #define EDITOR_GADGET1_LEFT_EDGE    (10 + (4 + 1) * 8)
  25. #define EDITOR_GADGET1_TOP_EDGE        5
  26. #define EDITOR_GADGET1_WIDTH        110
  27. #define EDITOR_GADGET1_HEIGHT        15
  28. #define EDITOR_GADGET1_TEXT_ATTR    &topaz80_attr
  29. #define EDITOR_GADGET1_ACTIVE        1
  30. #define EDITOR_GADGET1_TEXT_ARRAY    &template_type_text_array[0]
  31.  
  32. #define EDITOR_GADGET2_TYPE        GADGET_DATA_TYPE_BUTTON
  33. #define EDITOR_GADGET2_FLAGS        (GADGET_DATA_FLAG_HOT_KEY | GADGET_DATA_FLAG_BUTTON_TOGGLE)
  34. #define EDITOR_GADGET2_LEFT_EDGE    (EDITOR_GADGET1_LEFT_EDGE + EDITOR_GADGET1_WIDTH + 80 + 4 * 8)
  35. #define EDITOR_GADGET2_TOP_EDGE        5
  36. #define EDITOR_GADGET2_WIDTH        ((6 + 3) * 8)
  37. #define EDITOR_GADGET2_HEIGHT        15
  38. #define EDITOR_GADGET2_TEXT        "_Create"
  39. #define EDITOR_GADGET2_TEXT_ATTR    &topaz80_attr
  40.  
  41. #define EDITOR_GADGET3_TYPE        GADGET_DATA_TYPE_BUTTON
  42. #define EDITOR_GADGET3_FLAGS        (GADGET_DATA_FLAG_HOT_KEY | GADGET_DATA_FLAG_BUTTON_TOGGLE)
  43. #define EDITOR_GADGET3_LEFT_EDGE    (EDITOR_GADGET2_LEFT_EDGE + EDITOR_GADGET2_WIDTH + 10)
  44. #define EDITOR_GADGET3_TOP_EDGE        EDITOR_GADGET2_TOP_EDGE
  45. #define EDITOR_GADGET3_WIDTH        EDITOR_GADGET2_WIDTH
  46. #define EDITOR_GADGET3_HEIGHT        EDITOR_GADGET2_HEIGHT
  47. #define EDITOR_GADGET3_TEXT        "_Modify"
  48. #define EDITOR_GADGET3_TEXT_ATTR    &topaz80_attr
  49.  
  50. #define EDITOR_GADGET4_TYPE        GADGET_DATA_TYPE_BUTTON
  51. #define EDITOR_GADGET4_FLAGS        (GADGET_DATA_FLAG_HOT_KEY | GADGET_DATA_FLAG_BUTTON_TOGGLE)
  52. #define EDITOR_GADGET4_LEFT_EDGE    (EDITOR_GADGET3_LEFT_EDGE + EDITOR_GADGET3_WIDTH + 10)
  53. #define EDITOR_GADGET4_TOP_EDGE        EDITOR_GADGET2_TOP_EDGE
  54. #define EDITOR_GADGET4_WIDTH        EDITOR_GADGET2_WIDTH
  55. #define EDITOR_GADGET4_HEIGHT        EDITOR_GADGET2_HEIGHT
  56. #define EDITOR_GADGET4_TEXT        "C_lone"
  57. #define EDITOR_GADGET4_TEXT_ATTR    &topaz80_attr
  58.  
  59. #define EDITOR_GADGET5_TYPE        GADGET_DATA_TYPE_BUTTON
  60. #define EDITOR_GADGET5_FLAGS        (GADGET_DATA_FLAG_HOT_KEY | GADGET_DATA_FLAG_BUTTON_TOGGLE)
  61. #define EDITOR_GADGET5_LEFT_EDGE    EDITOR_GADGET2_LEFT_EDGE
  62. #define EDITOR_GADGET5_TOP_EDGE        (EDITOR_GADGET2_TOP_EDGE + EDITOR_GADGET2_HEIGHT + 5)
  63. #define EDITOR_GADGET5_WIDTH        EDITOR_GADGET2_WIDTH
  64. #define EDITOR_GADGET5_HEIGHT        EDITOR_GADGET2_HEIGHT
  65. #define EDITOR_GADGET5_TEXT        "_Delete"
  66. #define EDITOR_GADGET5_TEXT_ATTR    &topaz80_attr
  67.  
  68. #define EDITOR_GADGET6_TYPE        GADGET_DATA_TYPE_BUTTON
  69. #define EDITOR_GADGET6_FLAGS        (GADGET_DATA_FLAG_HOT_KEY | GADGET_DATA_FLAG_BUTTON_TOGGLE)
  70. #define EDITOR_GADGET6_LEFT_EDGE    EDITOR_GADGET3_LEFT_EDGE
  71. #define EDITOR_GADGET6_TOP_EDGE        EDITOR_GADGET5_TOP_EDGE
  72. #define EDITOR_GADGET6_WIDTH        EDITOR_GADGET2_WIDTH
  73. #define EDITOR_GADGET6_HEIGHT        EDITOR_GADGET2_HEIGHT
  74. #define EDITOR_GADGET6_TEXT        "_Edit"
  75. #define EDITOR_GADGET6_TEXT_ATTR    &topaz80_attr
  76.  
  77. #define EDITOR_GADGET7_TYPE        GADGET_DATA_TYPE_BUTTON
  78. #define EDITOR_GADGET7_FLAGS        (GADGET_DATA_FLAG_HOT_KEY | GADGET_DATA_FLAG_BUTTON_TOGGLE)
  79. #define EDITOR_GADGET7_LEFT_EDGE    EDITOR_GADGET4_LEFT_EDGE
  80. #define EDITOR_GADGET7_TOP_EDGE        EDITOR_GADGET5_TOP_EDGE
  81. #define EDITOR_GADGET7_WIDTH        EDITOR_GADGET2_WIDTH
  82. #define EDITOR_GADGET7_HEIGHT        EDITOR_GADGET2_HEIGHT
  83. #define EDITOR_GADGET7_TEXT        "_Use"
  84. #define EDITOR_GADGET7_TEXT_ATTR    &topaz80_attr
  85.  
  86. #define EDITOR_GADGET8_TYPE        GADGET_DATA_TYPE_LISTVIEW
  87. #define EDITOR_GADGET8_FLAGS        GADGET_DATA_FLAG_HOT_KEY
  88. #define EDITOR_GADGET8_LEFT_EDGE    10
  89. #define EDITOR_GADGET8_TOP_EDGE        (EDITOR_GADGET1_TOP_EDGE + EDITOR_GADGET1_HEIGHT + 19)
  90. #define EDITOR_GADGET8_WIDTH        242
  91. #define EDITOR_GADGET8_HEIGHT        70
  92. #define EDITOR_GADGET8_TEXT        "Defined Tem_plates"
  93. #define EDITOR_GADGET8_TEXT_ATTR    &topaz80_attr
  94. #define EDITOR_GADGET8_SPACING        0
  95. #define EDITOR_GADGET8_TOP        1
  96. #define EDITOR_GADGET8_LIST        (BYTE *)&template_list.tl_List
  97.  
  98.     /* Statics & globals for editor main gadgets */
  99.  
  100. BYTE *template_type_text_array[] = {
  101.     "Border", "Text", "Button", "Check", "Radio", "String", "Integer",
  102.     "Slider", "Scroller", "Cycle", "Count", "Listview", "Palette", NULL
  103. };
  104. STATIC struct GadgetData  editor_gadget_data[] = {
  105.    {
  106.     EDITOR_GADGET1_TYPE,        /* gd_Type */
  107.     EDITOR_GADGET1_FLAGS,        /* gd_Flags */
  108.     EDITOR_GADGET1_LEFT_EDGE,    /* gd_LeftEdge */
  109.     EDITOR_GADGET1_TOP_EDGE,    /* gd_TopEdge */
  110.     EDITOR_GADGET1_WIDTH,        /* gd_Width */
  111.     EDITOR_GADGET1_HEIGHT,        /* gd_Height */
  112.     EDITOR_GADGET1_TEXT,        /* *gd_Text */
  113.     EDITOR_GADGET1_TEXT_ATTR,    /* *gd_TextAttr */
  114.     {
  115.     0,                /* gd_CyclePad */
  116.     EDITOR_GADGET1_ACTIVE,        /* gd_CycleActive */
  117.     EDITOR_GADGET1_TEXT_ARRAY    /* gd_CycleTextArray */
  118.     }
  119.    }, {
  120.     EDITOR_GADGET2_TYPE,        /* gd_Type */
  121.     EDITOR_GADGET2_FLAGS,        /* gd_Flags */
  122.     EDITOR_GADGET2_LEFT_EDGE,    /* gd_LeftEdge */
  123.     EDITOR_GADGET2_TOP_EDGE,    /* gd_TopEdge */
  124.     EDITOR_GADGET2_WIDTH,        /* gd_Width */
  125.     EDITOR_GADGET2_HEIGHT,        /* gd_Height */
  126.     EDITOR_GADGET2_TEXT,        /* *gd_Text */
  127.     EDITOR_GADGET2_TEXT_ATTR,    /* *gd_TextAttr */
  128.     { 0, 0, 0 }
  129.    }, {
  130.     EDITOR_GADGET3_TYPE,        /* gd_Type */
  131.     EDITOR_GADGET3_FLAGS,        /* gd_Flags */
  132.     EDITOR_GADGET3_LEFT_EDGE,    /* gd_LeftEdge */
  133.     EDITOR_GADGET3_TOP_EDGE,    /* gd_TopEdge */
  134.     EDITOR_GADGET3_WIDTH,        /* gd_Width */
  135.     EDITOR_GADGET3_HEIGHT,        /* gd_Height */
  136.     EDITOR_GADGET3_TEXT,        /* *gd_Text */
  137.     EDITOR_GADGET3_TEXT_ATTR,    /* *gd_TextAttr */
  138.     { 0, 0, 0 }
  139.    }, {
  140.     EDITOR_GADGET4_TYPE,        /* gd_Type */
  141.     EDITOR_GADGET4_FLAGS,        /* gd_Flags */
  142.     EDITOR_GADGET4_LEFT_EDGE,    /* gd_LeftEdge */
  143.     EDITOR_GADGET4_TOP_EDGE,    /* gd_TopEdge */
  144.     EDITOR_GADGET4_WIDTH,        /* gd_Width */
  145.     EDITOR_GADGET4_HEIGHT,        /* gd_Height */
  146.     EDITOR_GADGET4_TEXT,        /* *gd_Text */
  147.     EDITOR_GADGET4_TEXT_ATTR,    /* *gd_TextAttr */
  148.     { 0, 0, 0 }
  149.    }, {
  150.     EDITOR_GADGET5_TYPE,        /* gd_Type */
  151.     EDITOR_GADGET5_FLAGS,        /* gd_Flags */
  152.     EDITOR_GADGET5_LEFT_EDGE,    /* gd_LeftEdge */
  153.     EDITOR_GADGET5_TOP_EDGE,    /* gd_TopEdge */
  154.     EDITOR_GADGET5_WIDTH,        /* gd_Width */
  155.     EDITOR_GADGET5_HEIGHT,        /* gd_Height */
  156.     EDITOR_GADGET5_TEXT,        /* *gd_Text */
  157.     EDITOR_GADGET5_TEXT_ATTR,    /* *gd_TextAttr */
  158.     { 0, 0, 0 }
  159.    }, {
  160.     EDITOR_GADGET6_TYPE,        /* gd_Type */
  161.     EDITOR_GADGET6_FLAGS,        /* gd_Flags */
  162.     EDITOR_GADGET6_LEFT_EDGE,    /* gd_LeftEdge */
  163.     EDITOR_GADGET6_TOP_EDGE,    /* gd_TopEdge */
  164.     EDITOR_GADGET6_WIDTH,        /* gd_Width */
  165.     EDITOR_GADGET6_HEIGHT,        /* gd_Height */
  166.     EDITOR_GADGET6_TEXT,        /* *gd_Text */
  167.     EDITOR_GADGET6_TEXT_ATTR,    /* *gd_TextAttr */
  168.     { 0, 0, 0 }
  169.    }, {
  170.     EDITOR_GADGET7_TYPE,        /* gd_Type */
  171.     EDITOR_GADGET7_FLAGS,        /* gd_Flags */
  172.     EDITOR_GADGET7_LEFT_EDGE,    /* gd_LeftEdge */
  173.     EDITOR_GADGET7_TOP_EDGE,    /* gd_TopEdge */
  174.     EDITOR_GADGET7_WIDTH,        /* gd_Width */
  175.     EDITOR_GADGET7_HEIGHT,        /* gd_Height */
  176.     EDITOR_GADGET7_TEXT,        /* *gd_Text */
  177.     EDITOR_GADGET7_TEXT_ATTR,    /* *gd_TextAttr */
  178.     { 0, 0, 0 }
  179.    }, {
  180.     EDITOR_GADGET8_TYPE,        /* gd_Type */
  181.     EDITOR_GADGET8_FLAGS,        /* gd_Flags */
  182.     EDITOR_GADGET8_LEFT_EDGE,    /* gd_LeftEdge */
  183.     EDITOR_GADGET8_TOP_EDGE,    /* gd_TopEdge */
  184.     EDITOR_GADGET8_WIDTH,        /* gd_Width */
  185.     EDITOR_GADGET8_HEIGHT,        /* gd_Height */
  186.     EDITOR_GADGET8_TEXT,        /* *gd_Text */
  187.     EDITOR_GADGET8_TEXT_ATTR,    /* *gd_TextAttr */
  188.     {
  189.     EDITOR_GADGET8_SPACING,        /* gd_ListViewSpacing */
  190.     EDITOR_GADGET8_TOP,        /* gd_ListViewTop */
  191.     EDITOR_GADGET8_LIST        /* gd_ListViewList */
  192.     }
  193.    }, {
  194.     INTUISUP_DATA_END        /* mark end of gadget data array */
  195.    }
  196. };
  197.     /* Defines for editor texts */
  198.  
  199. #define EDITOR_TEXT1_TYPE    TEXT_DATA_TYPE_TEXT
  200. #define EDITOR_TEXT1_FLAGS    TEXT_DATA_FLAG_PLACE_LEFT
  201. #define EDITOR_TEXT1_LEFT_EDGE    (EDITOR_GADGET2_LEFT_EDGE - 8)
  202. #define EDITOR_TEXT1_TOP_EDGE    (EDITOR_GADGET2_TOP_EDGE + (EDITOR_GADGET2_HEIGHT - 8) / 2)
  203. #define EDITOR_TEXT1_TEXT    "Mode"
  204. #define EDITOR_TEXT1_TEXT_ATTR    &topaz80_attr
  205.  
  206. #define EDITOR_TEXT2_TYPE    TEXT_DATA_TYPE_TEXT
  207. #define EDITOR_TEXT2_FLAGS    TEXT_DATA_FLAG_BOLD
  208. #define EDITOR_TEXT2_LEFT_EDGE    EDITOR_GADGET5_LEFT_EDGE
  209. #define EDITOR_TEXT2_TOP_EDGE    (EDITOR_GADGET5_TOP_EDGE + EDITOR_GADGET5_HEIGHT + 10)
  210. #define EDITOR_TEXT2_TEXT    "Template Information:"
  211. #define EDITOR_TEXT2_TEXT_ATTR    &topaz80_attr
  212.  
  213. #define EDITOR_TEXT3_TYPE    TEXT_DATA_TYPE_TEXT
  214. #define EDITOR_TEXT3_FLAGS    TEXT_DATA_FLAG_PLACE_LEFT
  215. #define EDITOR_TEXT3_LEFT_EDGE    (EDITOR_TEXT2_LEFT_EDGE + 20 + 4 * 8)
  216. #define EDITOR_TEXT3_TOP_EDGE    (EDITOR_TEXT2_TOP_EDGE + 14)
  217. #define EDITOR_TEXT3_TEXT    "Name"
  218. #define EDITOR_TEXT3_TEXT_ATTR    &topaz80_attr
  219.  
  220. #define EDITOR_TEXT4_TYPE    TEXT_DATA_TYPE_TEXT
  221. #define EDITOR_TEXT4_FLAGS    TEXT_DATA_FLAG_PLACE_LEFT
  222. #define EDITOR_TEXT4_LEFT_EDGE    EDITOR_TEXT3_LEFT_EDGE
  223. #define EDITOR_TEXT4_TOP_EDGE    (EDITOR_TEXT3_TOP_EDGE + 12)
  224. #define EDITOR_TEXT4_TEXT    "Type"
  225. #define EDITOR_TEXT4_TEXT_ATTR    &topaz80_attr
  226.  
  227. #define EDITOR_TEXT5_TYPE    TEXT_DATA_TYPE_TEXT
  228. #define EDITOR_TEXT5_FLAGS    TEXT_DATA_FLAG_PLACE_LEFT
  229. #define EDITOR_TEXT5_LEFT_EDGE    EDITOR_TEXT4_LEFT_EDGE
  230. #define EDITOR_TEXT5_TOP_EDGE    (EDITOR_TEXT4_TOP_EDGE + 12)
  231. #define EDITOR_TEXT5_TEXT    "Pos"
  232. #define EDITOR_TEXT5_TEXT_ATTR    &topaz80_attr
  233.  
  234. #define EDITOR_TEXT6_TYPE    TEXT_DATA_TYPE_TEXT
  235. #define EDITOR_TEXT6_FLAGS    TEXT_DATA_FLAG_PLACE_LEFT
  236. #define EDITOR_TEXT6_LEFT_EDGE    EDITOR_TEXT5_LEFT_EDGE
  237. #define EDITOR_TEXT6_TOP_EDGE    (EDITOR_TEXT5_TOP_EDGE + 12)
  238. #define EDITOR_TEXT6_TEXT    "Size"
  239. #define EDITOR_TEXT6_TEXT_ATTR    &topaz80_attr
  240.  
  241.     /* Statics for texts */
  242.  
  243. STATIC struct TextData  editor_text_data[] = {
  244.    {
  245.     EDITOR_TEXT1_TYPE,    /* td_Type */
  246.     EDITOR_TEXT1_FLAGS,    /* td_Flags */
  247.     EDITOR_TEXT1_LEFT_EDGE,    /* td_LeftEdge */
  248.     EDITOR_TEXT1_TOP_EDGE,    /* td_TopEdge */
  249.     EDITOR_TEXT1_TEXT,    /* *td_Text */
  250.     EDITOR_TEXT1_TEXT_ATTR    /* *td_TextAttr */
  251.    }, {
  252.     EDITOR_TEXT2_TYPE,    /* td_Type */
  253.     EDITOR_TEXT2_FLAGS,    /* td_Flags */
  254.     EDITOR_TEXT2_LEFT_EDGE,    /* td_LeftEdge */
  255.     EDITOR_TEXT2_TOP_EDGE,    /* td_TopEdge */
  256.     EDITOR_TEXT2_TEXT,    /* *td_Text */
  257.     EDITOR_TEXT2_TEXT_ATTR    /* *td_TextAttr */
  258.    }, {
  259.     EDITOR_TEXT3_TYPE,    /* td_Type */
  260.     EDITOR_TEXT3_FLAGS,    /* td_Flags */
  261.     EDITOR_TEXT3_LEFT_EDGE,    /* td_LeftEdge */
  262.     EDITOR_TEXT3_TOP_EDGE,    /* td_TopEdge */
  263.     EDITOR_TEXT3_TEXT,    /* *td_Text */
  264.     EDITOR_TEXT3_TEXT_ATTR    /* *td_TextAttr */
  265.    }, {
  266.     EDITOR_TEXT4_TYPE,    /* td_Type */
  267.     EDITOR_TEXT4_FLAGS,    /* td_Flags */
  268.     EDITOR_TEXT4_LEFT_EDGE,    /* td_LeftEdge */
  269.     EDITOR_TEXT4_TOP_EDGE,    /* td_TopEdge */
  270.     EDITOR_TEXT4_TEXT,    /* *td_Text */
  271.     EDITOR_TEXT4_TEXT_ATTR    /* *td_TextAttr */
  272.    }, {
  273.     EDITOR_TEXT5_TYPE,    /* td_Type */
  274.     EDITOR_TEXT5_FLAGS,    /* td_Flags */
  275.     EDITOR_TEXT5_LEFT_EDGE,    /* td_LeftEdge */
  276.     EDITOR_TEXT5_TOP_EDGE,    /* td_TopEdge */
  277.     EDITOR_TEXT5_TEXT,    /* *td_Text */
  278.     EDITOR_TEXT5_TEXT_ATTR    /* *td_TextAttr */
  279.    }, {
  280.     EDITOR_TEXT6_TYPE,    /* td_Type */
  281.     EDITOR_TEXT6_FLAGS,    /* td_Flags */
  282.     EDITOR_TEXT6_LEFT_EDGE,    /* td_LeftEdge */
  283.     EDITOR_TEXT6_TOP_EDGE,    /* td_TopEdge */
  284.     EDITOR_TEXT6_TEXT,    /* *td_Text */
  285.     EDITOR_TEXT6_TEXT_ATTR    /* *td_TextAttr */
  286.    }, {
  287.     INTUISUP_DATA_END    /* mark end of text data array */
  288.    }
  289. };
  290.     /* Defines for information texts */
  291.  
  292. #define INFO_TEXT_LINES        4
  293.  
  294. #define INFO_TEXT_LEFT_EDGE    (EDITOR_TEXT3_LEFT_EDGE + 8)
  295. #define INFO_TEXT_TOP_EDGE    EDITOR_TEXT3_TOP_EDGE
  296. #define INFO_TEXT_TYPE        TEXT_DATA_TYPE_TEXT
  297. #define INFO_TEXT_FLAGS        TEXT_DATA_FLAG_COLOR2
  298. #define INFO_TEXT_ATTR        EDITOR_TEXT3_TEXT_ATTR
  299.  
  300. #define INFO_TEXT_MAX_WIDTH    (EDITOR_WINDOW_WIDTH - INFO_TEXT_LEFT_EDGE)
  301. #define INFO_TEXT_YOFFSET    (EDITOR_TEXT4_TOP_EDGE - EDITOR_TEXT3_TOP_EDGE)
  302.  
  303. #define INFO_LINE_NAME    0
  304. #define INFO_LINE_TYPE    1
  305. #define INFO_LINE_POS    2
  306. #define INFO_LINE_SIZE    3
  307.  
  308.     /* Defines for menu */
  309.  
  310. #define MENU_TEXT_ATTR        &topaz60_attr
  311.  
  312. #define MENU_PROJECT                0
  313. #define    ITEM_PROJECT_WINDOW            0
  314. #define    ITEM_PROJECT_NEW            1
  315. #define    ITEM_PROJECT_LOAD            2
  316. #define    ITEM_PROJECT_APPEND            3
  317. #define    ITEM_PROJECT_SAVE            4
  318. #define    ITEM_PROJECT_SAVE_C            5
  319. #define    ITEM_PROJECT_ABOUT            6
  320. #define    ITEM_PROJECT_QUIT            7
  321.  
  322. #define MENU_EDIT                1
  323. #define    ITEM_EDIT_LOCK            0        
  324. #define    ITEM_EDIT_UNLOCK            1        
  325. #define       SUBITEM_EDIT_UNLOCK_SINGLE    0        
  326. #define       SUBITEM_EDIT_UNLOCK_ALL        1        
  327. #define    ITEM_EDIT_SNAP            2        
  328.  
  329.     /* Statics for menu */
  330.  
  331. STATIC struct MenuData  editor_menu_data[] = {
  332.    {
  333.     MENU_DATA_TYPE_TITLE, 0, "Project"
  334.    }, {
  335.        MENU_DATA_TYPE_ITEM, 0, "Window", "W", 0
  336.    }, {
  337.        MENU_DATA_TYPE_ITEM, 0, "New", "N", 0
  338.    }, {
  339.        MENU_DATA_TYPE_ITEM, 0, "Load", "L", 0
  340.    }, {
  341.        MENU_DATA_TYPE_ITEM, 0, "Append", "P", 0
  342.    }, {
  343.        MENU_DATA_TYPE_ITEM, 0, "Save", "S", 0
  344.    }, {
  345.        MENU_DATA_TYPE_ITEM, MENU_DATA_FLAG_DISABLED, "Save as C", "C", 0
  346.    }, {
  347.        MENU_DATA_TYPE_ITEM, 0, "About", "A", 0
  348.    }, {
  349.        MENU_DATA_TYPE_ITEM, MENU_DATA_FLAG_EMPTY_LINE, "Quit", "Q", 0
  350.    }, {
  351.     MENU_DATA_TYPE_TITLE, 0, "Edit"
  352.    }, {
  353.        MENU_DATA_TYPE_ITEM, MENU_DATA_FLAG_DISABLED, "Lock", "L", 0
  354.    }, {
  355.        MENU_DATA_TYPE_ITEM, MENU_DATA_FLAG_DISABLED, "Unlock", NULL, 0
  356.    }, {
  357.           MENU_DATA_TYPE_SUBITEM, 0, "Single", "U", 0
  358.    }, {
  359.           MENU_DATA_TYPE_SUBITEM, 0, "All", NULL, 0
  360.    }, {
  361.        MENU_DATA_TYPE_ITEM, 0, "Snap", NULL, 0
  362.    }, {
  363.           MENU_DATA_TYPE_SUBITEM, MENU_DATA_FLAG_ATTRIBUTE | MENU_DATA_FLAG_SELECTED, "1", NULL, ~(1 << 0)
  364.    }, {
  365.           MENU_DATA_TYPE_SUBITEM, MENU_DATA_FLAG_ATTRIBUTE, "2", NULL, ~(1 << 1)
  366.    }, {
  367.           MENU_DATA_TYPE_SUBITEM, MENU_DATA_FLAG_ATTRIBUTE, "4", NULL, ~(1 << 2)
  368.    }, {
  369.           MENU_DATA_TYPE_SUBITEM, MENU_DATA_FLAG_ATTRIBUTE, "6", NULL, ~(1 << 3)
  370.    }, {
  371.           MENU_DATA_TYPE_SUBITEM, MENU_DATA_FLAG_ATTRIBUTE, "8", NULL, ~(1 << 4)
  372.    }, {
  373.           MENU_DATA_TYPE_SUBITEM, MENU_DATA_FLAG_ATTRIBUTE, "10", NULL, ~(1 << 5)
  374.    }, {
  375.           MENU_DATA_TYPE_SUBITEM, MENU_DATA_FLAG_ATTRIBUTE, "12", NULL, ~(1 << 6)
  376.    }, {
  377.           MENU_DATA_TYPE_SUBITEM, MENU_DATA_FLAG_ATTRIBUTE, "14", NULL, ~(1 << 7)
  378.    }, {
  379.           MENU_DATA_TYPE_SUBITEM, MENU_DATA_FLAG_ATTRIBUTE, "16", NULL, ~(1 << 8)
  380.    }, {
  381.           MENU_DATA_TYPE_SUBITEM, MENU_DATA_FLAG_ATTRIBUTE, "18", NULL, ~(1 << 9)
  382.    }, {
  383.           MENU_DATA_TYPE_SUBITEM, MENU_DATA_FLAG_ATTRIBUTE, "20", NULL, ~(1 << 10)
  384.    }, {
  385.     INTUISUP_DATA_END    /* mark end of menu data */
  386.    }
  387. };
  388.     /* Editor action loop */
  389.  
  390.    SHORT
  391. editor_action_loop(VOID)
  392. {
  393.    struct TemplateList  *tl = &template_list;
  394.    struct MsgPort       *eup = ewin->UserPort,
  395.             *pup = pwin->UserPort;
  396.    struct Message       *msg;
  397.    LONG  signals, emask = 1L << eup->mp_SigBit, pmask = 1L << pup->mp_SigBit,
  398.      full_mask = emask | pmask;
  399.    BOOL  keepon = TRUE;
  400.    SHORT last_status, status = EDITOR_STATUS_NORMAL;
  401.  
  402.    if (!(egl = ICreateGadgets(eri, &editor_gadget_data[0], 0, 0))) {
  403.       status = EDITOR_ERROR_OUT_OF_MEM;
  404.    } else {
  405.       if (!(eml = ICreateMenu(eri, ewin, &editor_menu_data[0],
  406.                              MENU_TEXT_ATTR))) {
  407.      status = EDITOR_ERROR_OUT_OF_MEM;
  408.       } else {
  409.  
  410.      /* Init file requesters */
  411.      project_file_requester->fr_Flags2 |= FR2F_LongPath;
  412.      strcpy(project_file_requester->fr_File, PROJECT_FILE_NAME);
  413.  
  414.      csource_file_requester->fr_FuncFlags |= FRF_DoColor;
  415.      csource_file_requester->fr_Flags2    |= FR2F_LongPath;
  416.      csource_file_requester->fr_Hail       = CSOURCE_SAVE_HAIL_TEXT;
  417.      strcpy(csource_file_requester->fr_File, CSOURCE_FILE_NAME);
  418.  
  419.      /* Init template data */
  420.      NewList(&tl->tl_List);
  421.      strcpy(&tl->tl_ProjectName[0], DEFAULT_PROJECT_NAME);
  422.  
  423.      /* Set gadget defaults */
  424.      ISetGadgetAttributes(egl, EDITOR_GADGET_TYPE, 0L, USE_CURRENT_VALUE,
  425.             (LONG)DEFAULT_TEMPLATE_TYPE, (VOID *)USE_CURRENT_VALUE);
  426.      ISetGadgetAttributes(egl, FIRST_MODE_GADGET + DEFAULT_EDITOR_MODE,
  427.               0L, 1L, USE_CURRENT_VALUE, (VOID *)USE_CURRENT_VALUE);
  428.      print_project_window_title();
  429.  
  430.      /* Editor main loop */
  431.      do {
  432.  
  433.         /* Remove all IDCMP events from editor and project window */
  434.         while (msg = GetMsg(eup)) {
  435.            ReplyMsg(msg);
  436.         }
  437.         while (msg = GetMsg(pup)) {
  438.            ReplyMsg(msg);
  439.         }
  440.  
  441.         /* Display editor texts and gadgets, start use mode and attach menu */
  442.         IClearRenderWindow(eri, ewin, 0, 0, -1, -1);
  443.         IDisplayTexts(eri, ewin, &editor_text_data[0], 0, 0);
  444.         IDisplayGadgets(ewin, egl);
  445.         IAttachMenu(ewin, eml);
  446.         if (editor_mode == EDITOR_MODE_USE) {
  447.            start_gadget_use_mode();
  448.         }
  449.  
  450.         /* Editor IDCMP loop */
  451.         do {
  452.            signals = Wait(full_mask);
  453.            if (signals & emask) {
  454.           status = perform_editor_action();
  455.            }
  456.            if (signals & pmask) {
  457.           status = perform_project_action();
  458.            }
  459.         } while (status <= EDITOR_STATUS_NORMAL);
  460.  
  461.         /* Remove editor gadgets, end gadget use mode and remove menu */
  462.         IRemoveGadgets(egl);
  463.         if (editor_mode == EDITOR_MODE_USE) {
  464.            end_gadget_use_mode();
  465.         }
  466.         IRemoveMenu(eml);
  467.  
  468.         /* Perform special action given by status */
  469.         switch (last_status = status) {
  470.            case EDITOR_STATUS_EDIT :
  471.           if (selected_template) {
  472.              status = edit_template_data();
  473.           }
  474.           break;
  475.  
  476.            case EDITOR_STATUS_WINDOW :
  477.           status = change_project_window();
  478.           break;
  479.  
  480.            case EDITOR_STATUS_NEW :
  481.           if (!(tl->tl_Flags & TEMPLATE_LIST_FLAG_CHANGED) ||
  482.                 ok_cancel_requester(" New ", "Do you really"
  483.                  " want to start a new project?") == TRUE) {
  484.              status = new_project(TEMPLATE_LIST_FLAG_DEFAULT_WINDOW);
  485.           }
  486.           break;
  487.  
  488.            case EDITOR_STATUS_LOAD :
  489.           if (!(tl->tl_Flags & TEMPLATE_LIST_FLAG_CHANGED) ||
  490.                    ok_cancel_requester(" Load ", "Do you really"
  491.                   " want to load a new project?") == TRUE) {
  492.              status = load_project(LOAD_MODE_NORMAL);
  493.           }
  494.           break;
  495.  
  496.            case EDITOR_STATUS_APPEND :
  497.           if (!(tl->tl_Flags & TEMPLATE_LIST_FLAG_CHANGED) ||
  498.                  ok_cancel_requester(" Append ", "Do you really"
  499.                 " want to append a new project?") == TRUE) {
  500.              status = load_project(LOAD_MODE_APPEND);
  501.           }
  502.           break;
  503.  
  504.            case EDITOR_STATUS_SAVE :
  505.           status = save_project();
  506.           break;
  507.  
  508.            case EDITOR_STATUS_ABOUT :
  509.           about_requester();
  510.           break;
  511.  
  512.            case EDITOR_ERROR_NO_WINDOW :
  513.           keepon = FALSE;
  514.           break;
  515.         }
  516.         if (last_status == EDITOR_STATUS_WINDOW || last_status ==
  517.            EDITOR_STATUS_NEW || last_status == EDITOR_STATUS_LOAD) {
  518.  
  519.            /* Get user port data from new project window */
  520.            pup       = pwin->UserPort;
  521.            pmask     = 1L << pup->mp_SigBit;
  522.            full_mask = emask | pmask;
  523.         }
  524.         if (status == EDITOR_STATUS_QUIT) {
  525.            if (!(tl->tl_Flags & TEMPLATE_LIST_FLAG_CHANGED) ||
  526.                    ok_cancel_requester(" Quit ", "Do you really"
  527.                         " want to quit?") == TRUE) {
  528.           keepon = FALSE;
  529.            }
  530.         }
  531.         MWCheck();
  532.      } while (keepon == TRUE);
  533.  
  534.      /* Free resources */
  535.      free_template_list();
  536.      IFreeMenu(eml);
  537.       }
  538.       IFreeGadgets(egl);
  539.    }
  540.    return(status);
  541. }
  542.     /* Perform editor action */
  543.  
  544.    STATIC SHORT
  545. perform_editor_action(VOID)
  546. {
  547.    struct MsgPort       *up = ewin->UserPort;
  548.    struct IntuiMessage  *msg;
  549.    LONG   value;
  550.    USHORT code, entry;
  551.    SHORT  status = EDITOR_STATUS_NORMAL;
  552.  
  553.    while (msg = IGetMsg(up)) {
  554.       code = msg->Code;
  555.       switch (msg->Class) {
  556.      case CLOSEWINDOW :
  557.         status = EDITOR_STATUS_QUIT;
  558.         break;
  559.  
  560.      case ISUP_ID :
  561.         entry = code;
  562.         value = (LONG)msg->IAddress;
  563.         switch (entry) {
  564.            case EDITOR_GADGET_TYPE :
  565.           template_type = value;
  566.           print_project_window_title();
  567.           break;
  568.  
  569.            case EDITOR_GADGET_TEMPLATES :
  570.           clear_template_info();
  571.           if (get_template_by_num(value)) {
  572.              print_template_info();
  573.           }
  574.           break;
  575.  
  576.            default :
  577.           change_editor_mode(entry, value);
  578.           break;
  579.         }
  580.         break;
  581.  
  582.      case MENUPICK :
  583.         while (code != MENUNULL) {
  584.            switch (MENUNUM(code)) {
  585.           case MENU_PROJECT :
  586.              switch (ITEMNUM(code)) {
  587.             case ITEM_PROJECT_WINDOW :
  588.                status = EDITOR_STATUS_WINDOW;
  589.                break;
  590.  
  591.             case ITEM_PROJECT_NEW :
  592.                status = EDITOR_STATUS_NEW;
  593.                break;
  594.  
  595.             case ITEM_PROJECT_LOAD :
  596.                status = EDITOR_STATUS_LOAD;
  597.                break;
  598.  
  599.             case ITEM_PROJECT_APPEND :
  600.                status = EDITOR_STATUS_APPEND;
  601.                break;
  602.  
  603.             case ITEM_PROJECT_SAVE :
  604.                status = EDITOR_STATUS_SAVE;
  605.                break;
  606.  
  607.             case ITEM_PROJECT_SAVE_C :
  608.                status = EDITOR_STATUS_SAVE_C;
  609.                break;
  610.  
  611.             case ITEM_PROJECT_ABOUT :
  612.                status = EDITOR_STATUS_ABOUT;
  613.                break;
  614.  
  615.             case ITEM_PROJECT_QUIT :
  616.                status = EDITOR_STATUS_QUIT;
  617.                break;
  618.              }
  619.              break;
  620.           case MENU_EDIT :
  621.              switch (ITEMNUM(code)) {
  622.             case ITEM_EDIT_SNAP :
  623.                snap_offset = snap_offset_table[SUBNUM(code)];
  624.                break;
  625.              }
  626.              break;
  627.            }
  628.            code = IMenuItemAddress(eml, code)->NextSelect;
  629.         }
  630.         break;
  631.       }
  632.       IReplyMsg(msg);
  633.    }
  634.    return(status);
  635. }
  636.     /* Change editor mode */
  637.  
  638.    STATIC VOID
  639. change_editor_mode(USHORT gadget, LONG value)
  640. {
  641.    UBYTE  new_mode = gadget - FIRST_MODE_GADGET;
  642.    USHORT active_mode_gadget = editor_mode + FIRST_MODE_GADGET;
  643.  
  644.    if (gadget == active_mode_gadget) {
  645.  
  646.       /* If active mode gadget deselected so select it again */
  647.       ISetGadgetAttributes(egl, gadget, 0L, 1L, USE_CURRENT_VALUE,
  648.                          (VOID *)USE_CURRENT_VALUE);
  649.    } else {
  650.  
  651.       /* Deselect active mode gadget and set new editor mode */
  652.       ISetGadgetAttributes(egl, active_mode_gadget, 0L, 0L,
  653.                   USE_CURRENT_VALUE, (VOID *)USE_CURRENT_VALUE);
  654.  
  655.       /* Toggle gadget use mode */
  656.       if (new_mode == EDITOR_MODE_USE) {
  657.      start_gadget_use_mode();
  658.       } else {
  659.      if (editor_mode == EDITOR_MODE_USE) {
  660.         end_gadget_use_mode();
  661.      }
  662.       }
  663.       editor_mode = new_mode;
  664.       print_project_window_title();
  665.    }
  666. }
  667.     /* Print infos about current selected template info */
  668.  
  669.    VOID
  670. print_template_info(VOID)
  671. {
  672.    struct Template  *tp = selected_template;
  673.    BYTE   text[80];
  674.    USHORT i, top_edge = INFO_TEXT_TOP_EDGE;
  675.  
  676.    /* First clear old info texts */
  677.    if (info_displayed == TRUE) {
  678.       IClearRenderWindow(eri, ewin, INFO_TEXT_LEFT_EDGE, INFO_TEXT_TOP_EDGE,
  679.          INFO_TEXT_MAX_WIDTH, INFO_TEXT_TOP_EDGE + INFO_TEXT_LINES *
  680.                              INFO_TEXT_YOFFSET - 1);
  681.       draw_box_with_border(pwin, &info_template->tp_Box);
  682.    }
  683.  
  684.    /* Now print new info texts */
  685.    for (i = 0; i < INFO_TEXT_LINES; i++) {
  686.       switch (i) {
  687.      case INFO_LINE_NAME :
  688.         SPrintf(&text[0], "%s", &tp->tp_TemplateName[0]);
  689.         break;
  690.  
  691.      case INFO_LINE_TYPE :
  692.         SPrintf(&text[0], "%s", template_type_text_array[tp->tp_Type]);
  693.         break;
  694.  
  695.      case INFO_LINE_POS :
  696.         SPrintf(&text[0], "%d,%d", tp->tp_Box.bo_X1, tp->tp_Box.bo_Y1);
  697.         break;
  698.  
  699.      case INFO_LINE_SIZE :
  700.         SPrintf(&text[0], "%dx%d", tp->tp_Box.bo_X2 - tp->tp_Box.bo_X1 +
  701.                 1, tp->tp_Box.bo_Y2 - tp->tp_Box.bo_Y1 + 1);
  702.         break;
  703.       }
  704.       IPrintText(eri, ewin, &text[0], INFO_TEXT_LEFT_EDGE, top_edge,
  705.                INFO_TEXT_TYPE, INFO_TEXT_FLAGS, INFO_TEXT_ATTR);
  706.       top_edge += INFO_TEXT_YOFFSET;
  707.    }
  708.    draw_box_with_border(pwin, &tp->tp_Box);
  709.    info_template  = tp;
  710.    info_displayed = TRUE;
  711. }
  712.     /* Clear template info */
  713.  
  714.    VOID
  715. clear_template_info(VOID)
  716. {
  717.    if (info_displayed == TRUE) {
  718.       IClearRenderWindow(eri, ewin, INFO_TEXT_LEFT_EDGE, INFO_TEXT_TOP_EDGE,
  719.          INFO_TEXT_MAX_WIDTH, INFO_TEXT_TOP_EDGE + INFO_TEXT_LINES *
  720.                              INFO_TEXT_YOFFSET - 1);
  721.       draw_box_with_border(pwin, &info_template->tp_Box);
  722.       info_template  = NULL;
  723.       info_displayed = FALSE;
  724.    }
  725. }
  726.     /* Start gadget use mode */
  727.  
  728.    VOID
  729. start_gadget_use_mode(VOID)
  730. {
  731.    struct TemplateList  *tl = &template_list;
  732.    struct Template      *tp;
  733.    struct GadgetData    *gd;
  734.    USHORT num = tl->tl_GadgetTemplates;
  735.    SHORT  status = EDITOR_STATUS_NORMAL;
  736.  
  737.    if (num) {
  738.       if (!(use_gd = gd = AllocMem((LONG)(num + 1) *
  739.                sizeof(struct GadgetData), (LONG)MEMF_PUBLIC))) {
  740.      status = EDITOR_ERROR_OUT_OF_MEM;
  741.       } else {
  742.      for (tp = get_head(&tl->tl_List); tp; tp = get_succ(&tp->tp_Node)) {
  743.         if (TEMPLATE_GROUP(tp) == TEMPLATE_GROUP_GADGET) {
  744.            CopyMem((BYTE *)&tp->tp_Data.tp_GadgetData, (BYTE *)gd++,
  745.                        (LONG)sizeof(struct GadgetData));
  746.         }
  747.      }
  748.      gd->gd_Type = INTUISUP_DATA_END;   /* mark end of gadget data array */
  749.      if (!(use_gl = ICreateGadgets(pri, use_gd, 0, 0))) {
  750.         FreeMem(use_gd, (LONG)(num + 1) * sizeof(struct GadgetData));
  751.         status = EDITOR_ERROR_OUT_OF_MEM;
  752.          } else {
  753.         IDisplayGadgets(pwin, use_gl);
  754.          }
  755.       }
  756.       show_error(status);
  757.    }
  758. }
  759.     /* End gadget use mode */
  760.  
  761.    VOID
  762. end_gadget_use_mode(VOID)
  763. {
  764.    USHORT num = template_list.tl_GadgetTemplates;
  765.  
  766.    if (num) {
  767.       IRemoveGadgets(use_gl);
  768.       IFreeGadgets(use_gl);
  769.       FreeMem(use_gd, (LONG)(num + 1) * sizeof(struct GadgetData));
  770.    }
  771. }
  772.